package com.wanlian.dao;

import com.wanlian.vo.Page;

import java.util.List;
import java.util.Map;

 public interface GenericDao<T> {

    // 增加或者修改一条记录
    void insert(T t);

    void add(List<T> list);

    // 增加一条记录
    void add(T t);

    // 按对象删除一条记录
    void delete(T t);

    // 以字符串id删除一条记录
    void delete(String id);

    // 以整形id删除一条记录
    void delete(int id);

    // 更新一条记录
    void update(T t);

    void updateByMerge(T t);

    // 以字符串id查询一条记录
    T queryById(String id);


    // 以整形id查询一条记录
    T queryById(int id);

    // 以长整形Long查询一条记录
     T queryById(Long id);

    // 查询所有记录，以List的形式返回所有的查询记录
    List<T> queryAll();

    // 实现分页查询，将页面所需记录以list形式返回
    List<T> queryAllByPage(Page page);

    // 按条件查询，返回唯一结果，需要根据具体业务自己写条件查询的hql语句，
    // params为由查询条件拼接的数组，注意数组中的元素要和hql语句中的？对应，
    // 长度和位置均需保持一致
     T queryForObject(String hql, Object[] params);

    // 按条件查询，返回查询结果的第一条记录，
    // 需要根据具体业务自己写条件查询的hql语句，params为由查询条件拼接的数组，注意数组中的元素要和hql语句中的？对应，
    // 长度和位置均需保持一致
     T queryForTopObject(String hql, Object[] params);

    // 按条件查询，并以List的形式返回所有的查询结果
    // 需要根据具体业务自己写条件查询的hql语句，params为由查询条件拼接的数组，注意数组中的元素要和hql语句中的？对应，
    // 长度和位置均需保持一致
     List<T> queryForList(String hql, Object[] params);

    // 按条件查询，以分页的形式返回查询结果List<T>,需要传入page参数
    // 需要根据具体业务自己写条件查询的hql语句，params为由查询条件拼接的数组，注意数组中的元素要和hql语句中的？对应，
    // 长度和位置均需保持一致
     List<T> queryForListByPage(String hql, Object[] params, Page page);

    List<Object> queryForListObjectByPage(String hql, Object[] params, Page page);

    // 按条件查询，返回recordNum及其以后的所有记录；
    // 需要根据具体业务自己写条件查询的hql语句，params为由查询条件拼接的数组，注意数组中的元素要和hql语句中的？对应，
    // 长度和位置均需保持一致
     List<T> queryForList(final String hql, final Object[] params, final int recordNum);

    // 按条件查询，条件以Map的形式传到后台,以分页的形式返回数据，
    // 注意只能进行完成简单的条件查询的hql语句的拼接
     List<T> queryPageByMapConditions(Page page, Map<String, Object> queryConditions);
     Double queryDCount(String hql, Object[] params) ;
    
    // 按条件查询，并取得结果个数
     Long queryCount(String hql, Object[] params);

    void executeHql(String hql, Map<String, Object> map);

    int executeHqlWithCount(String hql, Map<String, Object> map);

     void executeSql(String hql);

    List<T> querySQLForListByPage(String hql, Object[] params, Page page);

    List<Map<String, Object>> queryForListObjectByPage(String hql, Object[] params, Page page, String[] column);

    int queryCountByParam(String hql, Object[] params);

    int queryRowNumByParam(String hql, Object[] params);

    List<Map<String, Object>> querySQLForList(String hql, Object[] params,String[] columns);

    int updateByJdbc(String sql,Object[] params);
    int updateBatchByJdbc(String sql,List<Object[]> params);

     List<Object[]> queryForListCu(String hql, Object[] params);
}
